﻿Imports System.Data  
Imports System.Text
Imports System.IO

Imports System.Collections.ObjectModel   


Public Class CValmerServicio


Public Shared EjecucionMasiva As Boolean = False 
Private  Const ENCABEZADO As String = "#init, FRIDA,INSTRUMENT,TYPE_VAL"



Private RUTA              As String 
Private NOMBREARCHIVO     As String 
Private COMANDO           As String 
Private PARAMETROS        As String 
Private PARAMETROSBATCH   As String 


Public Structure componetesInstrumento
   Dim tipoValor As String 
   Dim emision   As String 
   Dim serie     As String 
End Structure


Public Structure DatosDeControlBatch
   Dim regCorrectos     As Integer 
   Dim regIncorrectos   As Integer 
   Dim MsgError         As List(Of String ) 
End Structure



Public function ObtenerTablaDatos(ByRef parametros As CAccesoHTML.ParamConsultaDatosValmer ) As datatable
  Try
      Return CAccesoHTML.ConsultarDatosValmerCalc (parametros )      
  Catch ex As Exception
      Return Nothing 
  End Try

End Function


Public function ObtenerTablasCalculos(ByRef parametros As CAccesoHTML.ParamFlujosValmer ) As List(Of datatable )

Try

      return CAccesoHTML.ConsultarFlujosValmer(parametros)    

  Catch ex As Exception
      Return Nothing 
  End Try

End Function


Public function ObtenerFlujosComoLista(ByRef dt As Datatable, ByVal  iniRegDescartados as Integer, ByVal tipoInstrumento As String ) As List(Of CFlujoValmer )
Dim lstFlujos As new List(Of CFlujoValmer )  
Dim i As Integer 

Dim servGral As New CServiciosGenerales ()



Dim flujoAux As CFlujoValmer 
Dim fechaAux As Date 
Dim setAux   As String 

'iniRegDescartados: índice a partir del cual se toman los registros

Try
          
     For i = iniRegDescartados to dt.Rows.Count - 1
         flujoAux = New CFlujoValmer(dt.Rows(i) ) 

         If Not flujoAux.Fecha.Trim.Equals ("") and tipoInstrumento.Trim.Equals("UDI")  then 
             fechaAux = New Date (flujoAux.Fecha.Substring(0,4),flujoAux.Fecha.Substring(5,2),flujoAux.Fecha.Substring(8,2))                 
             fechaAux = servGral.ObtenerSigFechaNoLab(fechaAux.AddDays(-1),servGral.ObtenerFechasNoLab (12))   
             setAux   = fechaAux.ToString("dd-MM-yyyy")    'fechaAux.Year.ToString("0000") & "/" & fechaAux.Month.ToString("00")   & "/" & fechaAux.Day.ToString("00")   
         Else
             setAux = ""
         End If

         flujoAux.Settlement = setAux          
         lstFlujos.Add (flujoAux )          
     Next
 
      Return lstFlujos 
  Catch ex As Exception
      Return Nothing 
  End Try

End Function



Public function ObtenerInstrumentosDecalog(ByVal instrumento As String) As List(Of CInstrumentosConsulta)
Dim lstInst As new List(Of CInstrumentosConsulta)  

Dim dt As Datatable 
    

Try     

      dt = CServiciosMacrosSyBaseDB.ObtienerInstrumentosValmer (instrumento )

      If dt is Nothing then
         Return Nothing 
       End If


       For Each registro As DataRow In dt.Rows     
           lstInst.Add(New CInstrumentosConsulta (registro(0),registro (1) ))
       Next     
 
      Return lstInst
  Catch ex As Exception
      Return Nothing 
  End Try

End Function


Public Function ObtenerTipoInstrumentoDecalog(ByVal tipoValor As String) As String

Dim tipoEmisora As Integer 
  
Try
      tipoEmisora =  CServicioLocalSQLServerDB.ObtenerTipoEmisoraParaTipoValor (tipoValor) 

      Select Case tipoEmisora
         Case 1 ' Gubernamental
            Return "Guber.pl"

         Case 2 ' Bancario/Corporativo
            Return "Corp.pl"
     
         Case Else 
            Return ""
      End Select

Catch ex As Exception
      Return ""
End Try


End Function


Public Function Check(ByRef razonInstrumento As CRazonInstrumento,ByVal tipoInstrumento As String,  ByVal numInstrumento As Integer, ByRef sMsgError As String) As Boolean 

 Dim dtRazonInstrumeto As DataTable 


 Try

     dtRazonInstrumeto = CServiciosMacrosSyBaseDB.ObtienerDatosCheck(numInstrumento) 

              

     If dtRazonInstrumeto.Rows.Count = 1 then 

          If IsDBNull(dtRazonInstrumeto(0)("RECV_BASIS_FIXED"))
              sMsgError = "El instrumento no tiene BASE en Decalog por favor cambie la BASE"
              return False
              Exit Function
          End If

          If dtRazonInstrumeto(0)("RECV_BASIS_FIXED") = 0 Then
                 sMsgError = "El instrumento no tiene BASE en Decalog por favor cambie la BASE"
                 return False
                 Exit Function  
          End If
        

           
         If IsDBNull(dtRazonInstrumeto(0)("RECV_FREQ")) = True then 
            sMsgError  = "El instrumento no tiene FRECUENCIA en Decalog por favor cambie la FRECUENCIA"
            Return False 
            Exit Function
         End If

       
          If Trim(dtRazonInstrumeto(0)("RECV_FREQ")) = "" Then
               sMsgError  = "El instrumento no tiene FRECUENCIA en Decalog por favor cambie la FRECUENCIA"
               Return False 
               Exit Function
          End If


          If IsDBNull (dtRazonInstrumeto(0)("RATE_TYP")) = True then 
             sMsgError = "El instrumento no tiene RATE TYPE en Decalog por favor cambie el RATE TYPE"
             Return  False
             Exit Function
          End If

          If   Trim( dtRazonInstrumeto(0)("RATE_TYP")) = "" Then
               sMsgError = "El instrumento no tiene RATE TYPE en Decalog por favor cambie la RATE TYPE"
               Return  False
               Exit Function
          End If
                 


            If tipoInstrumento.IndexOf("FIJO") <> -1 And dtRazonInstrumeto(0)("RATE_TYP") <> "F" Then
                 sMsgError = "El instrumento según valmer es de tipo FIJO y en Decalog no esta dado de alta como tal por favor cambielo"
                 Return False
                 Exit Function
            End If


            
            If tipoInstrumento.IndexOf("FIJO") <> -1  And dtRazonInstrumeto(0)("RATE_TYP")  <> "F" And  IIF(ISDBNULL(dtRazonInstrumeto(0)("NOMINAL_RATE")),0, dtRazonInstrumeto(0)("NOMINAL_RATE")) = 0 Then
                sMsgError =  "El instrumento según valmer es de tipo FIJO y en Decalog no tiene ninguna tasa dada de alta"
                return False
                Exit Function
            End If






            If  tipoInstrumento.IndexOf("FLOTANTE") <> -1 And Trim(dtRazonInstrumeto(0)("RATE_TYP")) <> "R" Then
                sMsgError = "El instrumento segúnn valmer es de tipo FLOTANTE y en Decalog no esta dado de alta como tal, por favor cambielo"
                return False
                Exit Function
            End If


                                                                                                             
            If  tipoInstrumento.IndexOf("FLOTANTE") <> -1 And  Trim(dtRazonInstrumeto(0)("RATE_TYP")) <> "R" And  IIF(ISDBNULL(dtRazonInstrumeto(0)("RECV_IDX_COD")),0, dtRazonInstrumeto(0)("RECV_IDX_COD")) = 0 Then
                sMsgError = "El instrumento según valmer es de tipo FLOTANTE y no tiene en Decalog ningun índice asociado por favor entre uno"
                Return  False
                Exit Function
            End If
       

             With razonInstrumento

                  .NominalRate    = iif(IsDBNull(dtRazonInstrumeto(0)("NOMINAL_RATE")),0,dtRazonInstrumeto(0)("NOMINAL_RATE"))
                  .RateTyp        = iif(IsDBNull (dtRazonInstrumeto(0)("RATE_TYP")),"",dtRazonInstrumeto(0)("RATE_TYP"))
                  .RecvIdxCod     = iif(IsDBNull (dtRazonInstrumeto(0)("RECV_IDX_COD")),0,dtRazonInstrumeto(0)("RECV_IDX_COD"))
                  .RecvMarginAdd  = iif(IsDBNull (dtRazonInstrumeto(0)("RECV_MARGIN_ADD")),0,dtRazonInstrumeto(0)("RECV_MARGIN_ADD"))

             End With
            
             Return True 

     Else 

            sMsgError = "Existe más de un registro para el número de instrumento: " & numInstrumento 
            Return False 

     End If



 Catch ex As Exception

      sMsgError = ex.Message 
      Return False 

 End Try

End Function



Public Function ActualizarBorraDatosEvt(ByVal numInstrumento As Integer, ByRef sw As StreamWriter) As Boolean 
   Dim dt       As datatable
   Dim lineaEvt As String  

    Try
        dt = CServiciosMacrosSyBaseDB.ObtienerDatosEvt (numInstrumento)  

        If dt is Nothing then 
           Return False 
        End If
        If dt.Rows.Count = 0 then 
           Return False 
        End If

        For Each registro As DataRow  In dt.Rows 
          lineaEvt = "IC.=" & numInstrumento & ",EvtNr=" & registro("EVT_NUM") & ",EvtNat=D"   
          sw.WriteLine (lineaEvt)
        Next

        dt.Clear ()

        Return True 

    Catch ex As Exception
        Return False 
    End Try


End Function



Public Function ConstruirArchivoValmerDecalog(ByVal numInstrumento As Integer, ByRef flujos as List(Of  CFlujoValmer), ByRef razones As CRazonInstrumento, ByVal  moneda As String, ByRef sMsgError As String ) As Boolean 
  'Funcion de compatibilidad 

 Dim respuesta As Boolean  = False 

  Try
  
    Using sw As StreamWriter = File.CreateText(RUTA & NOMBREARCHIVO)
         sw.WriteLine(ENCABEZADO)
         respuesta  =    ConstruirArchivoValmerDecalog(sw, numInstrumento, flujos , razones , moneda , sMsgError)
         sw.Close()       
    End Using

    Return respuesta 

 Catch ex As Exception     
     Return respuesta     
 End Try


End Function


Public Function ConstruirArchivoValmerDecalog(ByRef sw As StreamWriter,ByVal numInstrumento As Integer, ByRef flujos as List(Of  CFlujoValmer), ByRef razones As CRazonInstrumento, ByVal  moneda As String, ByRef sMsgError As String ) As Boolean 
       Dim CalcBgDates           As String 
       Dim fechaFlujo            As String 
       Dim fechaFlujoAux         As date

       Dim lineaInteres          As String = ""
       Dim lineaReduccion        As String = ""
       Dim lineaRedem            As String = ""

 Try
 
       
                
                   
           If ActualizarBorraDatosEvt(numInstrumento,sw)=False then 
              sMsgError = "No se encontraron eventos para este instrumento" 
              Return False 
              Exit Function 
           End If

           Dim i As Integer 

           For i = 0 to flujos.Count -1 
                
                
                If i = 0 then 
                    fechaFlujoAux = DateTime.Parse(flujos(i).Fecha)
                     'fechaFlujoAux =  new Date(flujos(i).Fecha.Substring(0,4),flujos(i).Fecha.Substring(5,2),flujos(i).Fecha.Substring(8,2)) 
                     CalcBgDates =  fechaFlujoAux.AddDays (-Convert.ToInt32 ( flujos(0).Periodo)).ToString("dd-MM-yyyy")
                 else
                     'fechaFlujoAux =  new Date(flujos(i-1).Fecha.Substring(0,4),flujos(i-1).Fecha.Substring(5,2),flujos(i-1).Fecha.Substring(8,2)) 
                     fechaFlujoAux = DateTime.Parse(flujos(i-1).Fecha)
                     CalcBgDates = fechaFlujoAux.ToString("dd-MM-yyyy")
                End If

                fechaFlujoAux = DateTime.Parse(flujos(i).Fecha)
                'fechaFlujoAux =  new Date(flujos(i).Fecha.Substring(0,4),flujos(i).Fecha.Substring(5,2),flujos(i).Fecha.Substring(8,2)) 
                fechaFlujo =  fechaFlujoAux.ToString("dd-MM-yyyy")



                
                If  IsNumeric(flujos(i).Dias)  then

                    If Convert.ToInt32(flujos(i).Dias) > 0 then 

                        If razones.RateTyp.Trim.Equals ("F")

                             If (Not flujos(i).Settlement.Equals("") ) and moneda.Equals("UDI") then 
                               
                                lineaInteres = "IC.=" & numInstrumento & ",EvtCtraT=COUPAY,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCSttlDa=" & flujos(i).Settlement  & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo  & ", EvtUGrosA=" & flujos(i).Intereses  & ",EvtUNetA=" & flujos(i).Intereses & ",EvtRT=" & razones.RateTyp  & ",EvtIxC=" & razones.NominalRate.ToString  & ",EvtBasisCod=360,EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtFactor=1"

                             else

                                lineaInteres = "IC.=" & numInstrumento & ",EvtCtraT=COUPAY,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Intereses & ",EvtUNetA=" & flujos(i).Intereses & ",EvtRT=" & razones.RateTyp & ",EvtIxC=" & razones.NominalRate.ToString & ",EvtBasisCod=360,EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtFactor=1"

                             End If

                             sw.WriteLine(lineaInteres)


                        ElseIf razones.RateTyp.Trim.Equals ("R") or razones.RateTyp.Trim.Equals ("V") then 

                               If (Not flujos(i).Settlement.Equals("") ) and moneda.Equals("UDI") then 

                                   lineaInteres = "IC.=" & numInstrumento & ",EvtCtraT=COUPAY,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCSttlDa=" & flujos(i).Settlement & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Intereses & ",EvtUNetA=" &flujos(i).Intereses & ",EvtRT=" & razones.RateTyp & ",EvtIdxCod=" & razones.RecvIdxCod.ToString()    & ",EvtMarginAdd=" & razones.RecvMarginAdd.ToString()    & ",EvtValueDat=" & fechaFlujo & ",EvtBasisCod=360,EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtMarginMult=1,EvtFactor=1"  

                                else

                                   lineaInteres = "IC.=" & numInstrumento & ",EvtCtraT=COUPAY,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Intereses & ",EvtUNetA=" & flujos(i).Intereses & ",EvtRT=" & razones.RateTyp & ",EvtIdxCod=" & razones.RecvIdxCod.ToString() & ",EvtMarginAdd=" & razones.RecvMarginAdd.ToString() & ",EvtValueDat=" & fechaFlujo & ",EvtBasisCod=360,EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtMarginMult=1,EvtFactor=1"

                               End If

                               sw.WriteLine(lineaInteres)
                        End If



                        If IsNumeric( flujos(i).Amortizacion ) and (i+1) <= (flujos.Count -1)   then 

                            If Convert.ToInt32(flujos(i).Amortizacion) <> 0 and   IsNumeric (flujos(i+1).Dias) then 

                                   If (Not flujos(i).Settlement.Equals("") ) and moneda.Equals("UDI") then 

                                       lineaReduccion = "IC.=" & numInstrumento & ",EvtT=REDUCCIN,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCSttlDa=" & flujos(i).Settlement & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Amortizacion   & ",EvtUNetA=" & flujos(i).Amortizacion & ",EvtFacvI=" & flujos(i+1).ValorNominal  & ",EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtMarginMult=1,EvtFactor=1,EvtBasisCod=360,EvtRT=F"

                                   Else

                                       lineaReduccion = "IC.=" & numInstrumento & ",EvtT=REDUCCIN,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtEndDa=" & fechaFlujo & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(i).Periodo & ", EvtUGrosA=" & flujos(i).Amortizacion & ",EvtUNetA=" & flujos(i).Amortizacion & ",EvtFacvI=" & flujos(i+1).ValorNominal & ",EvtProb=1,EvtLsiz=1,EvtBalF=N,EvtMarginMult=1,EvtFactor=1,EvtBasisCod=360,EvtRT=F"

                                   End If

                                   sw.WriteLine(lineaReduccion)
                            End If


                        End If



                    End If

                End If


           Next

              
             'RATIFICAR CON EL USUARIO ESTA VALIDACIÓN
             fechaFlujoAux =  DateTime.Parse(flujos(flujos.Count - 1).Fecha)' new Date(flujos(flujos.Count - 1).Fecha.Substring(0,4),flujos(flujos.Count - 1).Fecha.Substring(5,2),flujos(flujos.Count - 1).Fecha.Substring(8,2)) 
             fechaFlujo    =  fechaFlujoAux.ToString("dd-MM-yyyy")
             CalcBgDates   = fechaFlujo


             lineaRedem = "IC.=" & numInstrumento & ",EvtCtraT=BONDRED,EvtDaT=C,EvtDa=" & fechaFlujo & ",EvtCalcBgDa=" & CalcBgDates & ",EvtDaysNb=" & flujos(flujos.Count - 1).Periodo   & ", EvtUGrosA=" & flujos(flujos.Count - 1).ValorNominal  & ",EvtUNetA=" & flujos(flujos.Count - 1).ValorNominal  & ",EvtProb=1,EvtFactor=1,EvtBasisCod=360,EvtRT=F" 

             sw.WriteLine(lineaRedem)
                      
     
     Return True 

Catch ex As Exception
     sMsgError = ex.Message 
     Return False 
End Try



End Function


Public sub EjecutarProceso (Optional ByVal esMasiva As Boolean = False )  
Dim servGrales As New CServiciosGenerales() 

 Try

        If esMasiva = True 
            servGrales.EjecutarProceso(RUTA & COMANDO, PARAMETROSBATCH  & RUTA & NOMBREARCHIVO, "Valmer")
        else
            servGrales.EjecutarProceso(RUTA & COMANDO, PARAMETROS & RUTA & NOMBREARCHIVO, "Valmer")
        End If

            
 Catch ex As Exception
      
 End Try
 
End sub


Public Function  ObtenerTipoValor(ByVal  tipoEmisora As CTipoValorValmer.TipoEmisora ) As ObservableCollection(Of CTipoValorValmer )

Dim dt As DataTable 
Dim lstTiposValmorValmer As New ObservableCollection(Of CTipoValorValmer )

 Try

    dt =  CServicioLocalSQLServerDB.ObtenerTiposValmer(tipoEmisora)

    For Each renglon As DataRow In dt.Rows         
        lstTiposValmorValmer.Add (New CTipoValorValmer (tipoEmisora,renglon ("tipo_valor")))
    Next

    Return lstTiposValmorValmer 

 Catch ex As Exception
    Throw ex
 End Try

End Function


Public Function AltaTipoValmer(ByVal tipoEmisora As CTipoValorValmer.TipoEmisora, ByVal tipoValor As String) As Boolean 
Try 
   if CServicioLocalSQLServerDB.AltaTipoValorValmer(tipoEmisora,tipoValor )  = True then 
       Return true
    Else 
       Throw New Exception("Falló el alta en la Base de Datos")
   End If

Catch ex As Exception
   Throw ex 
End Try

End Function


Public Function ActualizarTipoValmer(ByVal tipoEmisora As CTipoValorValmer.TipoEmisora, ByVal tipoValorANT As String,ByVal tipoValorNVO As String ) As Boolean

   Try 
   if CServicioLocalSQLServerDB.ActualizarTipoValorValmer ( tipoEmisora,tipoValorANT,tipoValorNVO ) = True then 
       Return true
   Else 
        Throw New Exception("Falló la actualización en la Base de Datos")
   End If

Catch ex As Exception
   Throw ex 
End Try

End Function


Public Function EliminarTipoValmer(ByVal tipoEmisora As CTipoValorValmer.TipoEmisora, ByVal tipoValor As String) As Boolean 
Try 
   if CServicioLocalSQLServerDB.EliminarTipoValorValmer(tipoEmisora,tipoValor  )  = True then 
       Return true
    Else 
        Throw New Exception("Falló la baja en la Base de Datos")
   End If

Catch ex As Exception
   Throw ex 
End Try

End Function




Public Function AltaFechaNoLab(ByVal fecha As Date, ByRef sMsgError As String) As Boolean 

      Dim sFecha As String = fecha.ToString("yyyy-MM-dd")
      Return  CServicioLocalSQLServerDB.DarDeAltaFechaNoLabValmer (sfecha,sMsgError)  

End Function



Public Function ActualizarFechaNoLab(ByVal fechaAct As Date, fechaNva As Date, ByRef sMsgError As String) As Boolean 

      Dim sFechaAct As String = fechaAct.ToString("yyyy-MM-dd")
      Dim sFechaNva As String = fechaNva.ToString("yyyy-MM-dd")

      Return  CServicioLocalSQLServerDB.ActualizarFechaNoLabValmer (sFechaAct,sFechaNva, sMsgError)  

End Function


Public Function EliminarFechaNoLab(ByVal fechaAct As Date, ByRef sMsgError As String) As Boolean 

      Dim sFechaAct As String = fechaAct.ToString("yyyy-MM-dd")    
      Return  CServicioLocalSQLServerDB.EliminarFechaNoLabValmer  (sFechaAct,sMsgError)  

End Function


Public Function EliminacionMasivaDeFechasNoLab(ByRef lstFechasNolab As Object, ByRef sMsgError As String) As Boolean 
Dim sParametros As String = "" 
 
   For Each fecha As CFechaNoLab In lstFechasNolab 
       sParametros &=  "'" & fecha.Fechanolab.ToString("yyyy-MM-dd")  & "',"
   Next
   sParametros = sParametros.Remove (sParametros.Count-1,1)
 
  If CServicioLocalSQLServerDB.EliminarFechaNoValmerMasiva  (sParametros,sMsgError) = True  then 
      Return True 
  Else 
     Return false
  End If
  
End Function


Public Function  CargaMasivaFechasNoLab(ByRef lstFechasCargaParam As List(Of CFechaNoLab ), ByRef sMsgError As String ) As Integer 
Dim servGral       As new CServiciosGenerales ()
'Dim negocio        As New CValmerServicio ()


Dim lstFechasCarga As List(Of CFechaNoLab ) = lstFechasCargaParam 
Dim lstDbFechas    As List(Of CFechaNoLab )
Dim lstFechasAux   As List(Of CFechaNoLab )



Dim i         As Integer 

Dim incorrectos As Integer = 0


   Try
         Dim ArrFechasAux(lstFechasCarga.Count - 1) As CFechaNoLab 

         lstFechasCarga.CopyTo (ArrFechasAux)
         lstFechasAux = ArrFechasAux.ToList 
         lstDbFechas  =  servGral.ObtenerFechasNoLab(12)
      
     
         If lstDbFechas.Count > 0 then 
         
             For i = 0 to lstFechasCarga.Count - 1
                   
                    if lstDbFechas.FindAll(Function(x) x.Fechanolab.Equals(lstFechasCarga(i).Fechanolab)).Count > 0 then 
                          lstFechasAux.Remove(lstFechasCarga(i))
                    End If            
              Next
         
         
         End If

        '2) Grabar en la Base de datos

         For i = 0 to lstFechasAux.Count - 1

           if  AltaFechaNoLab(lstFechasAux(i).Fechanolab,sMsgError) = False then 
               incorrectos += 1
               'grabar bitácora
           End If

         Next


         Return incorrectos 

  Catch ex As Exception
     'bitácora
      sMsgError = ex.Message 
      Return -1
  End Try


End Function 



    
'***************************************************************************************************************************************
'**************************************************FUNCIONALIDAD MASIVA*****************************************************************
'***************************************************************************************************************************************

  Public Structure  paramMasiva
        dim ejecutar    as byte
        Dim fechaeject  As Date 
        Dim sFechaeject As String 
  End Structure 




Public Function ObtenerSecTypePorGrupo(ByRef grupos As ObservableCollection(Of CTInstrumentosValmerBatch )) As  ObservableCollection (Of CTInstrumentosValmerBatch)

 Dim dtSecType As DataTable          
 Dim lstTipos As new ObservableCollection (Of CTInstrumentosValmerBatch)

Try

   '1) Armar la cadena de grupos 
      
      Dim GruposProc As new StringBuilder 
         

      For Each grupo As CTInstrumentosValmerBatch In grupos
          GruposProc.Append ("'" & grupo.Grupo  & "'")
          GruposProc.Append (",")  
      Next

       

       GruposProc.Remove (GruposProc.Length-1,1)
       

    '2) Obtener los instrumentos con sus respectivos tipos y grupos  

     
          dtSecType  = CServiciosMacrosSyBaseDB.ObtienerSecTypesXGrupo (GruposProc.ToString ())

          For Each reg As DataRow In dtSecType.Rows  
              lstTipos.Add (New CTInstrumentosValmerBatch(CTInstrumentosValmerBatch.TipoDeInstrumentoAProcesar.Dinamico,"",reg("TIPO"),-1,False) )
          Next


       Return  lstTipos

Catch ex As Exception       
      Throw ex 
      Return Nothing        
End Try
     

End Function


Public  function ObtenerInstrumPorSecType(ByRef secTypes As ObservableCollection (Of CTInstrumentosValmerBatch )) As ObservableCollection(Of CTInstrumentosValmerBatch )
  
 Dim dtInstrumentos As DataTable          
 Dim lstInstrumentos As new ObservableCollection (Of CTInstrumentosValmerBatch)



  Try
      
      '1) Armar la cadena de grupos 
 
      Dim secTypeProc As new StringBuilder 
  
       

      For Each secType As CTInstrumentosValmerBatch In secTypes 
          secTypeProc.Append (secType.Tipo)
          secTypeProc.Append (",") 
      Next

       
       secTypeProc.Remove (secTypeProc.Length-1,1)
      
    '2) Obtener información

         dtInstrumentos  = CServiciosMacrosSyBaseDB.ObtienerInstrumentosBatchValmerSecType  (secTypeProc.ToString ())

          For Each reg As DataRow In dtInstrumentos.Rows  
              lstInstrumentos.Add (New CTInstrumentosValmerBatch(CTInstrumentosValmerBatch.TipoDeInstrumentoAProcesar.Dinamico,reg("INST_GRP_COD"),reg("INST_TYP"),reg("INST_NUM"),reg("INST_SH_NAM")) )
          Next
               
       Return lstInstrumentos
      
      

  Catch ex As Exception
      Throw ex
  End Try
          
 End Function



Private function ObtenerInfoTipos(ByRef instrumentos As ObservableCollection(Of CTInstrumentosValmerBatch )) As DataTable 
  
  Try
      
    '1) Armar la cadena de grupos       
      Dim NumInstProc As new StringBuilder 
               
      For Each item As CTInstrumentosValmerBatch In instrumentos 
          NumInstProc.Append(item.NumInstrumento.ToString () ) 
          NumInstProc.Append (",") 
      Next
       
      NumInstProc.Remove (NumInstProc.Length-1,1)

      
    '2) Obtener información

      return  CServiciosMacrosSyBaseDB.ObtienerInfoTipoBatchValmer (NumInstProc.ToString ())

  Catch ex As Exception
      Throw ex
  End Try
          
 End Function


Public Function AlmacenarInstrumentosMasivos(ByRef instrumentos As ObservableCollection(Of CTInstrumentosValmerBatch ),  ByRef sMsgError As String) As  boolean    
 Return  CServicioLocalSQLServerDB.AltaInstrumentMasivosValmer (instrumentos,sMsgError )  
End Function 


Public sub LanzarProcesamientoValmerBatch(ByRef lstInstrumentos As ObservableCollection (Of  CTInstrumentosValmerBatch) ) 
        

   Dim control        As DatosDeControlBatch


   
   Dim dtInfoTipos     As DataTable 
   Dim infoTipo()      As  DataRow 
   Dim fechaOperacion  As string
   
   Dim sMsgError       As String = "" 
   Dim idBitacora      As Integer 

   control.MsgError = New List(Of String )
   
    CValmerServicio.EjecucionMasiva = True  

    idBitacora = CUtileria.GrabarBitacora ("MasivaValmer_Mantenimiento","LanzarProcesamientoValmerBatch","REGISTRO DE TIEMPO DE PROCESAMIENTO" )                       
    CUtileria.GrabarBitacora ("MasivaValmer","Inicio_Masiva_VALMER","Comienza la ejecución")                       
         
       '1) Obtener la información de los instrumentos según los datos de entrada
        
              if lstInstrumentos.Count <= 0 then 
                 control.MsgError.Add ("No hay instrumentos a procesar" )  
                 control.regCorrectos = -1
                 control.regIncorrectos  = -1 
                 Exit Sub 
              End If
        
             Try
            
                    If lstInstrumentos.Count > 0 then 

                         fechaOperacion = CServiciosMacrosSyBaseDB.FechaHoyDB ().ToString("yyyy-MM-dd")  
                         dtInfoTipos = ObtenerInfoTipos(lstInstrumentos)
             
                         Using sw As StreamWriter = File.CreateText(RUTA & NOMBREARCHIVO)
                             
                             sw.WriteLine(ENCABEZADO)
                             For Each instrumento As CTInstrumentosValmerBatch In lstInstrumentos 
                    
                                  sMsgError = ""

                                  If instrumento.DescInstrumento.Trim.Equals("") then
                                     instrumento.DescInstrumento = CServiciosMacrosSyBaseDB.ObtienerInstrumentEstaticosBatchValmer(instrumento.NumInstrumento)

                                     If instrumento.DescInstrumento.Equals ("") THEN 
                                        control.regIncorrectos += 1
                                        control.MsgError.Add ("Instrumento: " & instrumento.NumInstrumento & ", no se pudo procesar debido a que no existe un valor descriptivo para el instrumento" )  
                                        Continue For 
                                     End If

                                  End If



                                 '1)Selección de los datos de razón del instrumento a procesar
                                 infoTipo = Nothing  
                                 infoTipo =  dtInfoTipos.Select("INST_NUM = " & instrumento.NumInstrumento) 
                      

                    
                                 Dim razonInst As new CRazonInstrumento (if(IsDBNull(infoTipo(0)("NOMINAL_RATE")),0,infoTipo(0)("NOMINAL_RATE")), _
                                                                         if(IsDBNull (infoTipo(0)("RATE_TYP")),"",infoTipo(0)("RATE_TYP")), _
                                                                         if(IsDBNull (infoTipo(0)("RECV_IDX_COD")),0,infoTipo(0)("RECV_IDX_COD")), _
                                                                         if(IsDBNull (infoTipo(0)("RECV_MARGIN_ADD")),0,infoTipo(0)("RECV_MARGIN_ADD")))



                                 '2)Obtener de la pagina de Valmer los datos del instrumento a procesar

                                  Dim InstrumentoSeparado() As String 
                                  Dim paramValmer           As CAccesoHTML.ParamConsultaDatosValmer  
                                  Dim dtDatos               as DataTable 
                                  Dim compInstrumento       As componetesInstrumento 


 

                                  InstrumentoSeparado =  Instrumento.DescInstrumento.Split ("_")  

                                  If InstrumentoSeparado.Length = 3 then 
                        
                                          compInstrumento.tipoValor  = InstrumentoSeparado(0) 
                                          compInstrumento.emision    = InstrumentoSeparado(1) 
                                          compInstrumento.serie      = InstrumentoSeparado(2)
   

                                          With paramValmer
                                              .tv           = compInstrumento.tipoValor
                                              .emisora      = compInstrumento.emision
                                              .serie        = compInstrumento.serie
                                              .radio        = "precio"

                                              .tipoInstDec  = ObtenerTipoInstrumentoDecalog (.tv)
                                              .fecha        = fechaOperacion

                                              .numRegLayout = "18"
                                              .numColLayout = "2"
                                         End With                         


                                         dtDatos =  ObtenerTablaDatos (paramValmer)

                             
                                         If dtDatos is Nothing then 
                                            control.regIncorrectos += 1
                                            control.MsgError.Add ("Instrumento: " & instrumento.NumInstrumento & ", no se pudo procesar debido a que no se pudo obtener los datos del sitio Valmer" )  
                                            Continue For 
                                         End If                    


                                        ' 3) Calcular Instrumento

                                         Dim tablasHTMLaVB   As New List(Of DataTable)   
                                         Dim parametrosCalc As CAccesoHTML.ParamFlujosValmer 
                             
                             
                                         With  parametrosCalc
                             
                                                .tv          = paramValmer.tv 
                                                .emisora     = paramValmer.emisora 
                                                .serie       = paramValmer.serie 
                                                .calcula     = "Calcular"
                                                .radio       = "precio"
                                                .tipoInstDec = paramValmer.tipoInstDec 
                                                .fecha       = fechaOperacion
                                                .pEdit       = ""
                             
                                                .sobretasa          = dtDatos(0)(1)
                                                .tasaRendimiento    = dtDatos(1)(1)
                                                .tasaCupon          = dtDatos(2)(1)
                                                .tasaMercado        = dtDatos(3)(1)
                                                .isr                = dtDatos(4)(1)
                                                .tipoCambioUDI      = dtDatos(5)(1)
                                                .tipoCambioUSD      = dtDatos(6)(1)
                                                .tasaDescuento      = dtDatos(7)(1)
                             
                                         End With
                             

                                         tablasHTMLaVB =  ObtenerTablasCalculos (parametrosCalc)


                                          if tablasHTMLaVB is Nothing  then                                              
                                             control.regIncorrectos += 1
                                             control.MsgError.Add ("Instrumento: " & instrumento.NumInstrumento & ", no se pudo procesar. no se pudo procesar debido a que no se pudo utilizar la calculadora del sitio Valmer" )  
                                             Continue For                                 
                                          End If

                             
                                         '4) Obtener flujos

                                          Dim flujos As List(Of CFlujoValmer)  

                                          flujos = ObtenerFlujosComoLista(tablasHTMLaVB(3),3, tablasHTMLaVB(0)(0)(1)) 

                                          If flujos.Count <= 0 then 
                                             control.regIncorrectos += 1
                                             control.MsgError.Add ("Instrumento: " & instrumento.NumInstrumento & ", no se pudo procesar debido a que no tiene flujos" )  
                                             Continue For               
                                          End If


                                          If ConstruirArchivoValmerDecalog(sw,instrumento.NumInstrumento,flujos,razonInst, tablasHTMLaVB(0)(3)(1).ToString(), sMsgError) = True  then
                                             control.regCorrectos += 1                               
                                          Else 
                                             control.regIncorrectos += 1
                                             control.MsgError.Add ("Instrumento: " & instrumento.NumInstrumento & ", no se pudo procesar: " & sMsgError )  
                                                                  
                                          End If

                         
                                  End If    
                     

                             Next
                
                             sw.Close ()
                        End Using

                    End If
        
                  CUtileria.CompletarRegBitacora (idBitacora) 


                   For Each mensage As String In  control.MsgError 
                       CUtileria.GrabarBitacora ("MasivaValmer","LanzarProcesamientoValmerBatch",mensage )                       
                   Next
                   CUtileria.GrabarBitacora ("MasivaValmer","Fin_Masiva_VALMER","Se proceso: " & control.regCorrectos + control.regIncorrectos & " registros, " & control.regCorrectos & " correctos y " & control.regIncorrectos & " imcompletos o incorrectos."     )                       
                    

              CValmerServicio.EjecucionMasiva = False   

             Catch ex As Exception
                 CValmerServicio.EjecucionMasiva = False 
                 CUtileria.GrabarBitacora ("MasivaValmer","Fin_Masiva_VALMER_ERROR","Se proceso: " & control.regCorrectos + control.regIncorrectos & " registros, " & control.regCorrectos & " correctos y " & control.regIncorrectos & " imcompletos o incorrectos. (" & ex.Message & ")")                       
                 Throw ex
            End Try

   
End Sub 


Public Function ObtenerNumInstrumAlmacenados() As ObservableCollection(Of CTInstrumentosValmerBatch )
 Dim dt As DataTable
 Dim lstNumInstrum As new ObservableCollection(Of CTInstrumentosValmerBatch )

  Try 
       dt   = CServicioLocalSQLServerDB.ObtenerNumInstrumentosEjecMasivaVALMER()
       
       For Each  reg As DataRow In dt.Rows           
           lstNumInstrum.Add(New CTInstrumentosValmerBatch (CTInstrumentosValmerBatch.TipoDeInstrumentoAProcesar.Dinamico,reg("GRUPO"),reg("SECTYPE"),reg("NUM_INSTRUMENTO"),reg("DESC_INSTRUMENTO")))                 
       Next

       Return lstNumInstrum 

  Catch ex As Exception
      Throw ex
  End Try
    


End Function


Public Function ObtenerParamEjecMasiva() As paramMasiva 
 Dim dt As DataTable
 Dim param As paramMasiva 


  Try 
       dt   = CServicioLocalSQLServerDB.ObtenerParamEjecMasivaVALMER ()
       
       param.ejecutar = Convert.ToByte ( dt.Rows(0)("PARAMETRO_VALOR"))
       param.fechaeject = Convert.ToDateTime ( dt.Rows(0)("FECHA_ALTA"))
       param.sFechaeject = dt.Rows(0)("FECHA_ALTA")
       Return param 

  Catch ex As Exception
      Throw ex
  End Try
    


End Function

Public Function AlmacenarParametros(ByRef param As paramMasiva, ByRef sMsgError As String) As Boolean  
     return   CServicioLocalSQLServerDB.ActualizarParametrosMasivosValmer (param,sMsgError) 
End Function

Public Function HayDatosAlmacenadosParaLaMasiva() As Boolean
    Try
        return CServicioLocalSQLServerDB.ExistenNumerosDeInstrumentos ()
    Catch ex As Exception
       Throw 
    End Try
        
End Function

Public Function EliminarDatosAlacenadosMasiva(ByRef sMsgError As String) As Boolean
   Return CServicioLocalSQLServerDB.BorrarNumInstrumentoMasivosValmer(sMsgError)  
End Function

Public Function ObtenerRegistrosBitacoraBatch(ByVal fechaIni As DateTime, ByVal fechaFin As DateTime, ByVal hayCondicion As Boolean) As ObservableCollection(Of CRegistroBitacora)
 
Dim dt As DataTable     
Dim lst As new ObservableCollection(Of CRegistroBitacora )
 
 Try
    dt = CServicioLocalSQLServerDB.ObtenerRegistrosBitBatchValmer(fechaIni.ToString , fechaFin.ToString ,hayCondicion )
    
    For Each registro As DataRow  In dt.Rows           
       lst.Add(New CRegistroBitacora(registro))         
    Next
             
 Catch ex As Exception
     Throw ex
 End Try

 Return lst

 
End Function


'***************************************************************************************************************************************
'**************************************************FIN MASIVA*****************************************************************
'***************************************************************************************************************************************


    Public Sub New()

        Dim servGrales As New CServiciosGenerales ()   

        RUTA           = CServicioLocalSQLServerDB.ObtenerRutaArchivoValmer ()  
        NOMBREARCHIVO  = servGrales.ObtenerPREFIJOARCHIVO &  CServicioLocalSQLServerDB.ObtenerNombreArchivoValmer () 
        COMANDO        = CServicioLocalSQLServerDB.ObtenerNombreComandoTLoderValmer ()
        PARAMETROS     = CServicioLocalSQLServerDB.ObtenerParamComandoTLoderValmer ()
        PARAMETROSBATCH = CServicioLocalSQLServerDB.ObtenerParamComandoTLoderValmerBatch ()
    End Sub


End Class

